package com.xzcedu.jdbc.datasource;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.junit.jupiter.api.Test;

import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
 * @author 徐州城
 * @version 1.0
 * 演示C3P0 的使用
 */
public class C3P0_ {

    @SuppressWarnings("all")
    @Test
    //方式1: 相关参数，在程序中指定user，url，password等
    public void testC3P0_01() throws Exception{

        //1. 创建一个数据源对象
        ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
        //2. 通过配置文件获取 mysql.properties 获取相关联的信息
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\com\\xzcedu\\jdbc\\mysql.properties"));
        //读取相关的值
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String driver = properties.getProperty("driver");
        String url = properties.getProperty("url");

        //给数据源 comboPooledDataSource
        //注意: 连接管理是由 comboPooledDataSource 来管理
        comboPooledDataSource.setJdbcUrl(url);
        comboPooledDataSource.setDriverClass(driver);
        comboPooledDataSource.setUser(user);
        comboPooledDataSource.setPassword(password);

        //设置初始化连接数 (连接池)
        comboPooledDataSource.setInitialPoolSize(10);
        //最大连接数
        comboPooledDataSource.setMaxPoolSize(50);
        Connection connection = comboPooledDataSource.getConnection();//这个方法就是从 DataSource 接口实现的

        System.out.println("开始执行...");
        long start = System.currentTimeMillis();
        //测试连接池的效率，测试连接mysql 5000次操作
        for (int i = 0; i < 5000; i++) {
            //System.out.println("连接成功OK!!!");
            //关闭资源
            connection.close();
        }
        long end = System.currentTimeMillis();
        System.out.println("C3P0 5000次连接mysql 耗时=" + (end - start));//C3P0 5000次连接mysql 耗时=10

        comboPooledDataSource.close();
    }


    @Test
    @SuppressWarnings("all")
    //方式2: 使用配置文件模板完成
    /*
        1. 将c3p0 提供的 c3p0-config.xml 拷贝到 src目录下
        2. 该文件指定了连接数据库和连接池的相关参数
     */
    public void testC3P0_02() throws SQLException {

        ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource("xzc");

        Connection connection = comboPooledDataSource.getConnection();
        System.out.println("开始执行..");
        long start = System.currentTimeMillis();
        //测试连接池的效率，测试连接mysql 5000次操作
        for (int i = 0; i < 500000; i++) {
            //关闭资源
            connection.close();
        }
        long end = System.currentTimeMillis();
        //C3P0的第二种方式 耗时=5
        System.out.println("C3P0的第二种方式 耗时=" + (end - start));
        comboPooledDataSource.close();
    }
}
